retain cycle
Avoiding retain cycles in Swift. If you want to develop a high… | by André Gimenez Faria | Apple Developer Academy | Mackenzie | Medium
この記事がわかりやすい(読んで)
相互参照的な意味で使われている
code:swift
class Book {
// strong refference
private var pages = Page()
func add(_ page : Page) {
pages.append(page)
}
}
class Page {
// strong reference
private var book : Book
required init(book : Book) {
self.book = book
}
}
let book = Book()
let page = Page(book: book)
book.add(page)
実行するとメモリリークが起きる
PageとBookが互いに参照を持ち合う
ライフサイクルが終わってもメモリから消えない
Bookの役割がPageで使われているから消えない
Pageの役割が終わってもBookで使われているから消えない
A memory leak occurs when a content remains in memory even after its lifecycle has ended.
In this case, the memory leak is caused by two strong variables that address each other.
対処
code:swift
class Book {
private var pages = Page()
func add(_ page : Page) {
pages.append(page)
}
}
class Page {
// weak reffenrence / nilを許容するようになった
private weak var book : Book?
required init(book : Book) {
self.book = book
}
}
let book = Book()
let page = Page(book: book)
book.add(page)